package com.xyy.saas.payment.util;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * @author wangtianqi
 * @date 2020/9/2 10:50
 */
public class AmountCastUtil {

    public static final DecimalFormat df1 = new DecimalFormat("0.00");

    static {
        df1.setRoundingMode(RoundingMode.DOWN);
    }

    public static String decimalFormat(String value) {
        try {
            return df1.format(new BigDecimal(value));
        } catch (Exception e) {
            return value;
        }
    }

    public static String decimalFormat(BigDecimal value) {
        try {
            return df1.format(value);
        } catch (Exception e) {
            return value.toString();
        }
    }

    public static BigDecimal sum(BigDecimal... bigDecimal) {
        BigDecimal sum = BigDecimal.ZERO;
        for (BigDecimal decimal : bigDecimal) {
            sum = sum.add(decimal);
        }
        return sum;
    }

    /**
     * 分转元
     * @param amount
     * @return
     */
    public static String castFen2Yuan(int amount) {
        return  new BigDecimal(amount).divide(new BigDecimal(100)).toString();
    }

    /**
     * 分转元
     * @param amount
     * @return
     */
    public static String castFen2Yuan2(int amount) {
        return  new BigDecimal(amount).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP).toString();
    }

    /**
     * 分转元
     * @param amount
     * @return
     */
    public static BigDecimal castFen2YuanByBigDecimal(int amount) {
        return  new BigDecimal(amount).divide(new BigDecimal(100));
    }

    /**
     * 分转元
     * @param amount
     * @return
     */
    public static String castFen2Yuan(long amount) {
        return  new BigDecimal(amount).divide(new BigDecimal(100)).toString();
    }

    public static BigDecimal castFen2Yuan2(long amount) {
        return new BigDecimal(amount).divide(new BigDecimal(100));
    }

    /**
     * 元转分
     * @param amount
     * @return
     */
    public static Integer castYuan2Fen(String amount) {
        if(StringUtils.isBlank(amount)) {
            return NumberUtils.INTEGER_ZERO;
        }

        return new BigDecimal(amount).multiply(new BigDecimal(100)).intValue();
    }

    public static Integer castYuan2Fen(BigDecimal amount) {
        if(amount == null) {
            return NumberUtils.INTEGER_ZERO;
        }

        return amount.multiply(new BigDecimal(100)).intValue();
    }
    /**
     * 元转分
     * @param amount
     * @return
     */
    public static long castY2F(String amount) {
        if(StringUtils.isBlank(amount)) {
            return NumberUtils.LONG_ZERO;
        }
        return new BigDecimal(amount).multiply(new BigDecimal(100)).longValue();
    }

    /**
     * 元转分输出long
     * @param amount
     * @return
     */
    public static Long castYuan2FenLong(String amount) {
        return new BigDecimal(amount).multiply(new BigDecimal(100)).longValue();
    }

    /**
     * 将BigDecimal类型转换成100倍的int类型（用于支付金额为分的处理）<br/><br/>
     *
     * 第三方很奸诈，他们很聪明的支付时候按照分来处理<br/><br/>
     *
     * @param b 要转换的数值
     * @return String 转换后的钱数（0.01分钱就转换成了1，1元钱就转换成了100，以此类推）
     */
    public static String formatBigDecimal2PercentInt(BigDecimal b) {
        BigDecimal r = b.multiply(new BigDecimal("100"));
        return String.valueOf(r.intValue());
    }

    public static String formatBigDecimal2PercentInt(String b) {
        if (StringUtils.isBlank(b)) {
            return null;
        }
        BigDecimal r = new BigDecimal(b).multiply(new BigDecimal("100"));
        return String.valueOf(r.intValue());
    }


    /**
     * 富民支付手续费费率计算
     * @param amount 单位分
     * @return
     */
    public static String round(Integer amount) {
        BigDecimal d = new BigDecimal(castFen2Yuan(amount));  // 交易金额
        BigDecimal r = new BigDecimal("0.0021");         //  手续费
        BigDecimal i = d.multiply(r).setScale(2, RoundingMode.HALF_UP);
        return i.toString();
    }

    /**
     * 富民支付手续费费率计算
     * @param pay 单位分
     * @param refund 单位分
     * @return
     */
    public static String roundByFBankRefund(Integer pay, Integer refund) {
        BigDecimal bPay = new BigDecimal(castFen2Yuan(pay));  // 交易金额
        BigDecimal bRefund = new BigDecimal(castFen2Yuan(refund));  // 退款金额
        BigDecimal rate = bRefund.divide(bPay,8, RoundingMode.HALF_UP);
        BigDecimal i = rate.multiply(new BigDecimal(round(pay))).setScale(2, RoundingMode.HALF_UP);
        return i.toString();
    }

    /**
     * 判断两个字符串数字是否相等
     * @param aAmount
     * @param bAmount
     * @return
     */
    public static boolean equalsAmount(String aAmount, String bAmount) {
        if(StringUtils.isBlank(aAmount) || StringUtils.isBlank(bAmount)) {
            return false;
        }

        BigDecimal left = new BigDecimal(aAmount);
        BigDecimal right = new BigDecimal(bAmount);
        return left.compareTo(right) == 0;
    }

}
